<!doctype html>
<html lang="en">
 <head> 
  <meta charset="UTF-8"> 
  <meta name="description" content="燎火的个人博客"> 
  <meta name="keyword" content="燎火,qq799378666,软件开发,java,c#,js,html,html5,css"> 
  <title>C# 如何调用 C++ DLL中的函数接口和回调函数</title> 
  <script src="/js/jquery-1.11.1.min.js"></script> 
  <script src="/js/bootstrap-3.3.5/js/bootstrap.js"></script> 
  <link href="/js/bootstrap-3.3.5/css/bootstrap.css" rel="stylesheet"> 
  <script src="/js/base.js"></script> 
  <script src="/js/nav.js"></script> 
  <script src="/js/jquery.toTop.min.js"></script> 
  <link href="/style/article.css" rel="stylesheet"> 
 </head> 
 <body> 
  <div id="main"> 
   <h3 id="title">C# 如何调用 C++ DLL中的函数接口和回调函数</h3> 
   <div id="content">
    <p>摘要: 当我们需要在C#中调用C++ DLL中的函数接口和回调函数时，我们最重要的是需要如何转换C++中的类型为C#中的类型，主要是需要研究C#的Marshal 类，该类提供了一个方法集，这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型，此外还提供了在与非托管代码交互时使用的其他杂项方法。</p>
    <p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">1、C#中大部分基本数据类型都和C++的基本数据类型相同，因此基本数据类型的转换比较简单，需要注意的就是字节大小。 2、C++数组和C#的数组转换需要注意的就是需要注意，需要增加声明如[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]才能定义一个C++中的数组元素为10个的数组。 3、 C++的回调函数接口需要采用C#中的委托函数方法，C++的中回调函数设置中，一般使用的是地址值，因此需要C#中显示采用托管函数。 4、C++的指针数组，可用C#中的IntPtr ;如果只是地址指针，则C#中引用类型即可。类型前加ref</p>
    <p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">举例说明： using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;</p>
    <p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">namespace IPNBSVTD_CSharp { public delegate void StatusCallBack(IntPtr dwInstance, IntPtr wParam, IntPtr lParam); public delegate void VoiceCallBack(IntPtr dwInstance, byte ucDeviceIndex, IntPtr pInDataBuf, ref int pInDataLen, IntPtr pOutDataBuf, int nOutDataLen);</p>
    <pre class="hljs cs" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; background-color: rgb(63, 63, 63); color: rgb(220, 220, 220); border-radius: 3px; line-height: 1.4; word-wrap: normal; font-size: 13px; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace;">public&nbsp;enum&nbsp;VT_MESSAGE
{
&nbsp;&nbsp;&nbsp;&nbsp;VT_MESSAGE_SET_DEVICE_INFO,
&nbsp;&nbsp;&nbsp;&nbsp;VT_MESSAGE_UPDATE_DEVICE_INFO,
&nbsp;&nbsp;&nbsp;&nbsp;VT_MESSAGE_UPDATE_MIXER_IN_CTRL,
&nbsp;&nbsp;&nbsp;&nbsp;VT_MESSAGE_UPDATE_MIXER_OUT_CTRL,
&nbsp;&nbsp;&nbsp;&nbsp;VT_MESSAGE_MISSED_CALLS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;未接来电};public&nbsp;enum&nbsp;VT_TASK_TYPE&nbsp;//终端状态{
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//空闲(无任务)
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_TO_MONITOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发起监听
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_BY_MONITOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//被监听
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_TO_BROADCAST,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发起采播
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_BY_BROADCAST,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收采播
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_TO_TALK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发起对讲
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_BY_TALK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收对讲
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_MULTITALK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//多方通话
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_TYPE_OFFLINETALK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//离线对讲};public&nbsp;enum&nbsp;VT_TASK_STATE&nbsp;//终端任务状态&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无任务
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_STOP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;监听停止,对讲停止,广播停止
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_CONNECTING,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;监听:连接中
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_CALLING,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;对讲:呼叫中
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_BEGIN_BC_PROMPT,&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;广播:开始提示音
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_END_BC_PROMPT,&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;广播:结束提示音
&nbsp;&nbsp;&nbsp;&nbsp;VT_TASK_STATE_ONGOING,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;监听中,对讲中,广播中};public&nbsp;enum&nbsp;VT_TARGET_STATE&nbsp;//&nbsp;目标状态{
&nbsp;&nbsp;&nbsp;&nbsp;VT_TARGET_STATE_NULL&nbsp;=&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;未知
&nbsp;&nbsp;&nbsp;&nbsp;VT_TARGET_STATE_OFFLINE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;目标脱机
&nbsp;&nbsp;&nbsp;&nbsp;VT_TARGET_STATE_STOP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;目标停止
&nbsp;&nbsp;&nbsp;&nbsp;VT_TARGET_STATE_REJECT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;目标拒绝
&nbsp;&nbsp;&nbsp;&nbsp;VT_TARGET_STATE_BUSY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;目标呼叫忙};

[StructLayout(LayoutKind.Sequential)]public&nbsp;struct&nbsp;VT_TASK_TARGET
{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;nCount;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;监听,对讲,广播选择的目标数量
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;nEditPos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;当前正在编辑的位置
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;VT_TASK_TYPE&nbsp;xeTaskType;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;任务类型
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;VT_TASK_STATE&nbsp;xeTaskState;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;任务组的任务状态
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;VT_TARGET_STATE&nbsp;xeTargetState;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;对讲目标状态
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bIsBegin;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;任务是否已开始(呼叫...)
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;6)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;VT_TASK_STATE[]&nbsp;pxeTerState;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;各终端的任务状态&nbsp;&nbsp;VT_DEVICE_MAX_COUNT&nbsp;6
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;128)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort[]&nbsp;pwID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;终端ID(0:1号终端...)或分区号(1:分区1...)&nbsp;VT_BROADCAST_MAX_COUNT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;128
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;128)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int[]&nbsp;piSerIdx;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;各终端对应的服务器编号
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;6)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;byte[]&nbsp;pucPanelNo;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;NAS-8521,呼叫到面板,终端对应的面板序号
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;256)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;char[]&nbsp;strFileName;&nbsp;//&nbsp;文件广播时,当前广播的文件名
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;uint&nbsp;offlineTargetIP;&nbsp;//离线目标IP
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort&nbsp;offlineTargetPort;&nbsp;&nbsp;//离线目标端口};

[StructLayout(LayoutKind.Sequential)]public&nbsp;struct&nbsp;tagSERVER
{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;uint&nbsp;ipServer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;服务器IP&nbsp;(字节反序)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort&nbsp;wServerPort;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;服务器接收端口&nbsp;(字节反序)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bFixPort;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否固定接收端口
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort&nbsp;wHostPort;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;本机接收端口&nbsp;(字节反序)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bOnline;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否联机
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bIsPCM;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否是PCM/ADPCM压缩
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bIs8K;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否是8K/22K采样
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bIsMultiCast;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否是组播/单播
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bRecord;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否录音
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;uint&nbsp;ipRecord;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;录音IP
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort&nbsp;wRecordPort;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;录音端口};

[StructLayout(LayoutKind.Sequential)]public&nbsp;struct&nbsp;VT_DEVICE_INFO
{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort&nbsp;wDeviceId;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设备编号(从0开始,显示时要加1)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;uint&nbsp;ipHost;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;主机IP&nbsp;(字节反序)
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;bIsRegister;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否注册
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ushort&nbsp;dwVol;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;当前输出音量
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;iServerCount;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;服务器的数量
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;10)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;tagSERVER[]&nbsp;pxsServer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;服务器
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;nTaskCount;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;任务数量
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;nCurTask;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;当前任务(对应于xsTaskTarget的下标)
&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.ByValArray,&nbsp;SizeConst&nbsp;=&nbsp;1)]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;VT_TASK_TARGET[]&nbsp;pxsTaskArray;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;任务目标};///&nbsp;&lt;summary&gt;///&nbsp;跨平台调用方法///&nbsp;&lt;/summary&gt;public&nbsp;class&nbsp;NativeMethod{&nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;&lt;summary&gt;
&nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;路径最大大小
&nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;const&nbsp;int&nbsp;MAX_PATH&nbsp;=&nbsp;260;

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;void&nbsp;IPNBSVTD_DeleteDevice();

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;byte&nbsp;IPNBSVTD_CreateDevice(byte&nbsp;ucCount);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_DeviceMute(ref&nbsp;bool&nbsp;pbMute,&nbsp;bool&nbsp;bIsAudioOut,&nbsp;bool&nbsp;bIsSet);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_DeviceVolume(ref&nbsp;int&nbsp;pdwVolume,&nbsp;bool&nbsp;bIsAudioOut,&nbsp;bool&nbsp;bIsSet);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;void&nbsp;IPNBSVTD_SetINIFilePath(byte&nbsp;ucDeviceIndex,&nbsp;string&nbsp;pINIFilePath);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_OpenServer(byte&nbsp;ucDeviceIndex,&nbsp;IntPtr&nbsp;hParentWnd,&nbsp;uint&nbsp;nMsg);&nbsp;&nbsp;&nbsp;&nbsp;//[DllImport("IPNBSVTD.dll")]
&nbsp;&nbsp;&nbsp;&nbsp;//public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetBCFromFile(byte&nbsp;ucDeviceIndex,&nbsp;bool&nbsp;bBCFromFile,&nbsp;bool&nbsp;bLoop,
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.LPArray)]string[]&nbsp;pStrFile,&nbsp;short&nbsp;sFileCount);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetBCFromFileEx(byte&nbsp;ucDeviceIndex,&nbsp;bool&nbsp;bBCFromFile,&nbsp;bool&nbsp;bLoop,&nbsp;string&nbsp;strFile,&nbsp;bool&nbsp;bAdd);&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;SetBCFromFile(byte&nbsp;ucDeviceIndex,&nbsp;bool&nbsp;bBCFromFile,&nbsp;bool&nbsp;bLoop,&nbsp;List&lt;string&gt;&nbsp;files,&nbsp;short&nbsp;sFileCount)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;files.Count;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPNBSVTD_SetBCFromFileEx(ucDeviceIndex,&nbsp;bBCFromFile,&nbsp;bLoop,&nbsp;files[i],&nbsp;(i&nbsp;==&nbsp;0)&nbsp;?&nbsp;false&nbsp;:&nbsp;true);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetBCToTerm(byte&nbsp;ucDeviceIndex);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_GetCurTaskTarget(byte&nbsp;ucDeviceIndex,&nbsp;ref&nbsp;VT_TASK_TARGET&nbsp;pTaskTarget,&nbsp;int&nbsp;iTaskPos);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetCurTaskTarget(byte&nbsp;ucDeviceIndex,&nbsp;ref&nbsp;VT_TASK_TARGET&nbsp;pTaskTarget,&nbsp;int&nbsp;iTaskPos);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_TaskBegin(byte&nbsp;ucDeviceIndex,&nbsp;int&nbsp;iTaskPos);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_TaskEnd(byte&nbsp;ucDeviceIndex,&nbsp;int&nbsp;iTaskPos);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_GetDeviceInfo(byte&nbsp;ucDeviceIndex,&nbsp;ref&nbsp;VT_DEVICE_INFO&nbsp;pDeviceInfo);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_GetBCFileCurrent(byte&nbsp;ucDeviceIndex,&nbsp;StringBuilder&nbsp;strFile);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetStatusCallBack(byte&nbsp;ucDeviceIndex,&nbsp;StatusCallBack&nbsp;dwCallBack,&nbsp;IntPtr&nbsp;dwInstance);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetVoiceCallBack(byte&nbsp;ucDeviceIndex,&nbsp;VoiceCallBack&nbsp;dwCallBack,&nbsp;IntPtr&nbsp;dwInstance);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetFileBCNext(byte&nbsp;ucDeviceIndex);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetFileBCPause(byte&nbsp;ucDeviceIndex,&nbsp;bool&nbsp;bPause);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetFileBCPrevious(byte&nbsp;ucDeviceIndex);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;uint&nbsp;IPNBSVTD_GetBCFileCurrentPlayPos(byte&nbsp;ucDeviceIndex,&nbsp;ref&nbsp;uint&nbsp;pBcFileLen);

&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("IPNBSVTD.dll")]&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;IPNBSVTD_SetFileBCPlayListPos(byte&nbsp;ucDeviceIndex,&nbsp;byte&nbsp;ucPlayListPos);
}</pre>
    <p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">}</p>
    <p><br></p>
   </div> 
  </div>  
 </body>
</html>